﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class PessoaCAT
    {
        #region Variaveis Membro
        private int _idCAT;
        private int _idPessoa;
        private bool _isGerouAfastamento;
        private DateTime? _dataEmissao;
        private DateTime? _dataAcidente;
        private string _local;
        private string _path;
        private const int _idTipoCAT = 15;
        private GENTEEntities _context;
        #endregion

        #region Propriedades
        public int IdCAT
        {
            get { return _idCAT; }
            set { _idCAT = value; }
        }
        public int IdPessoa
        {
            get { return _idPessoa; }
            set { _idPessoa = value; }
        }
        public bool IsGerouAfastamento
        {
            get { return _isGerouAfastamento; }
            set { _isGerouAfastamento = value; }
        }
        public string GerouAfastamento
        {
            get { return (_isGerouAfastamento) ? "Sim" : "Não"; }
        }
        public DateTime? DataEmissao
        {
            get { return _dataEmissao; }
            set { _dataEmissao = value; }
        }
        public DateTime? DataAcidente
        {
            get { return _dataAcidente; }
            set { _dataAcidente = value; }
        }
        public string Local
        {
            get { return _local; }
            set { _local = value; }
        }
        public string Path
        {
            get { return _path; }
            set { _path = value; }
        }
        #endregion

        #region Construtores
        public PessoaCAT()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public PessoaCAT(int idCAT)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idCAT);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Privados
        private void Carregar(int idCAT)
        {
            try
            {
                var consulta = from cat in _context.tab_pessoa_atestado
                               where cat.tab_tipo_atestado.id_tipo_atestado == _idTipoCAT
                               && cat.id_atestado == idCAT
                               select new
                               {
                                   id_cat = cat.id_atestado,
                                   cat.tab_pessoa.Id_pessoa,
                                   gerou_afastamento = cat.g_afastamento,
                                   cat.dt_emissao,
                                   cat.dt_acidente,
                                   cat.local,
                                   cat.obs,
                                   cat.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this.IdCAT = list.id_cat;
                    this.IdPessoa = list.Id_pessoa;
                    this.IsGerouAfastamento = (list.gerou_afastamento == "S") ? true : false;
                    this.DataEmissao = list.dt_emissao;
                    this.DataAcidente = list.dt_acidente;
                    this.Local = list.local;
                    this.Path = list.path;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        protected void RecuperaId()
        {
            try
            {
                var consulta = from cat in _context.tab_pessoa_atestado
                               where cat.tab_pessoa.Id_pessoa == this.IdPessoa
                               && cat.dt_emissao == this.DataEmissao
                               && cat.dt_acidente == this.DataAcidente
                               && cat.tab_tipo_atestado.id_tipo_atestado == _idTipoCAT
                               && cat.local == this.Local
                               orderby cat.id_atestado descending
                               select cat;

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this.IdCAT = list.id_atestado;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Publicos

        #region Metodos de Selecao
        public List<PessoaCAT> SelectAll()
        {
            try
            {
                List<PessoaCAT> listCat = new List<PessoaCAT>();

                var consulta = from cat in _context.tab_pessoa_atestado
                               where cat.tab_tipo_atestado.id_tipo_atestado == _idTipoCAT
                               select new
                               {
                                   id_cat = cat.id_atestado,
                                   cat.tab_pessoa.Id_pessoa,
                                   gerou_afastamento = cat.g_afastamento,
                                   cat.dt_emissao,
                                   cat.dt_acidente,
                                   cat.local,
                                   cat.obs,
                                   cat.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    PessoaCAT CAT = new PessoaCAT();
                    CAT.IdCAT = list.id_cat;
                    CAT.IdPessoa = list.Id_pessoa;
                    CAT.IsGerouAfastamento = (list.gerou_afastamento == "S") ? true : false;
                    CAT.DataEmissao = list.dt_emissao;
                    CAT.DataAcidente = list.dt_acidente;
                    CAT.Local = list.local;
                    CAT.Path = list.path;

                    listCat.Add(CAT);
                }

                return listCat;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<PessoaCAT> SelectPor(int idPessoa)
        {
            try
            {
                List<PessoaCAT> listCat = new List<PessoaCAT>();

                var consulta = from cat in _context.tab_pessoa_atestado
                               where cat.tab_tipo_atestado.id_tipo_atestado == _idTipoCAT
                               && cat.tab_pessoa.Id_pessoa == idPessoa
                               select new
                               {
                                   id_cat = cat.id_atestado,
                                   cat.tab_pessoa.Id_pessoa,
                                   gerou_afastamento = cat.g_afastamento,
                                   cat.dt_emissao,
                                   cat.dt_acidente,
                                   cat.local,
                                   cat.obs,
                                   cat.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    PessoaCAT CAT = new PessoaCAT();
                    CAT.IdCAT = list.id_cat;
                    CAT.IdPessoa = list.Id_pessoa;
                    CAT.IsGerouAfastamento = (list.gerou_afastamento == "S") ? true : false;
                    CAT.DataEmissao = list.dt_emissao;
                    CAT.DataAcidente = list.dt_acidente;
                    CAT.Local = list.local;
                    CAT.Path = list.path;

                    listCat.Add(CAT);
                }

                return listCat;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos de Persistencia
        public void Salvar()
        {
            try 
            {	        
        		if (this.IdCAT == 0)
                {
                    tab_pessoa_atestado tabCAT = new tab_pessoa_atestado();
                    tabCAT.tab_pessoaReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_pessoa", "Id_pessoa", this.IdPessoa);
                    tabCAT.tab_tipo_atestadoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_atestado", "id_tipo_atestado", _idTipoCAT);
                    tabCAT.g_afastamento = (this.IsGerouAfastamento) ? "S" : "N";
                    tabCAT.dt_acidente = this.DataAcidente;
                    tabCAT.dt_emissao = this.DataEmissao;
                    tabCAT.local = this.Local;

                    _context.AddTotab_pessoa_atestado(tabCAT);
                    _context.SaveChanges();

                    RecuperaId();
                }
                else
                {
                    tab_pessoa_atestado tabCAT = (from cat in _context.tab_pessoa_atestado
                                                  where cat.tab_tipo_atestado.id_tipo_atestado == _idTipoCAT
                                                  && cat.id_atestado == this.IdCAT
                                                  select cat).First();

                    tabCAT.tab_pessoaReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_pessoa", "Id_pessoa", this.IdPessoa);
                    tabCAT.tab_tipo_atestadoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_atestado", "id_tipo_atestado", _idTipoCAT);
                    tabCAT.g_afastamento = (this.IsGerouAfastamento) ? "S" : "N";
                    tabCAT.dt_acidente = this.DataAcidente;
                    tabCAT.dt_emissao = this.DataEmissao;
                    tabCAT.local = this.Local;                    

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
	            throw ex;
            }
        }
        public void AtualizaPath()
        {
            try
            {
                if (this.IdCAT != 0)
                {
                    tab_pessoa_atestado tabCAT = (from cat in _context.tab_pessoa_atestado
                                                  where cat.tab_tipo_atestado.id_tipo_atestado == _idTipoCAT
                                                  && cat.id_atestado == this.IdCAT
                                                  select cat).First();

                    tabCAT.path = this.Path;

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void Excluir()
        {
            try
            {
                if (this.IdCAT != 0)
                {
                    tab_pessoa_atestado tabCAT = (from cat in _context.tab_pessoa_atestado
                                                  where cat.id_atestado == this.IdCAT
                                                  || cat.tab_pessoa_atestado2.id_atestado == this.IdCAT
                                                  select cat).First();

                    _context.DeleteObject(tabCAT);
                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion
    }
}
